bitkeeper revision 1.1205.1.5 (42160256WLh3PYM-V5i-QJliGUxICA)
authormaf46@burn.cl.cam.ac.uk <maf46@burn.cl.cam.ac.uk>
Fri, 18 Feb 2005 14:57:26 +0000 (14:57 +0000)
committermaf46@burn.cl.cam.ac.uk <maf46@burn.cl.cam.ac.uk>
Fri, 18 Feb 2005 14:57:26 +0000 (14:57 +0000)
Added a toggle so that debugtrace_printk's can be redirected to the
console or to their own private buffer.

xen/common/keyhandler.c
xen/drivers/char/console.c
xen/include/xen/lib.h

index 4615588cb6618fe3a99df7976b996af2d06df69e..2ef722afe078d6a9d7862a69a48a28deb182eb01 100644 (file)
@@ -158,7 +158,10 @@ void do_debug_key(unsigned char key, struct xen_regs *regs)
 #ifndef NDEBUG
 void debugtrace_key(unsigned char key)
 {
-    debugtrace_dump();
+    static int send_to_console = 0;
+
+    send_to_console = !send_to_console;
+    debugtrace_dump(send_to_console);
 }
 #endif
 
index b513520703407cf2c4c8a8dc141e771754e32b96..aa487cceae89adc112d5f0b5c1938f466b681737 100644 (file)
@@ -479,23 +479,35 @@ void console_force_lock(void)
 static unsigned char *debugtrace_buf; /* Debug-trace buffer */
 static unsigned int   debugtrace_prd; /* Producer index     */
 static unsigned int   debugtrace_kilobytes = 128, debugtrace_bytes;
+static int            debugtrace_send_to_console = 0;
 static spinlock_t debugtrace_lock = SPIN_LOCK_UNLOCKED;
 integer_param("debugtrace", debugtrace_kilobytes);
 
-void debugtrace_reset(void)
-{
-    unsigned long  flags;
 
-    spin_lock_irqsave(&debugtrace_lock, flags);
+static void _debugtrace_reset(int send_to_console)
+{
+    if (send_to_console)
+        printk("debugtrace_printk now writting to console\n");
+    else
+        printk("debugtrace_printk now writting to buffer\n");
 
     if ( debugtrace_bytes != 0 )
         memset(debugtrace_buf, '\0', debugtrace_bytes);
+
     debugtrace_prd = 0;
+    debugtrace_send_to_console = send_to_console;
+}
 
+void debugtrace_reset(int send_to_console)
+{
+    unsigned long flags;
+
+    spin_lock_irqsave(&debugtrace_lock, flags);
+    _debugtrace_reset(send_to_console);
     spin_unlock_irqrestore(&debugtrace_lock, flags);
 }
 
-void debugtrace_dump(void)
+void debugtrace_dump(int send_to_console)
 {
     int _watchdog_on = watchdog_on;
 
@@ -514,8 +526,7 @@ void debugtrace_dump(void)
     debugtrace_buf[debugtrace_prd] = '\0';
     serial_puts(sercon_handle, &debugtrace_buf[0]);
 
-    memset(debugtrace_buf, '\0', debugtrace_bytes);
-    debugtrace_prd = 0;
+    _debugtrace_reset(send_to_console);
 
     spin_unlock(&debugtrace_lock);
 
@@ -537,15 +548,22 @@ void debugtrace_printk(const char *fmt, ...)
 
     va_start(args, fmt);
     (void)vsnprintf(buf, sizeof(buf), fmt, args);
-    va_end(args);        
+    va_end(args);
 
-    for ( p = buf; *p != '\0'; p++ )
+    if (debugtrace_send_to_console)
     {
-        debugtrace_buf[debugtrace_prd++] = *p;
-
-        /* always leave a null byte at the end of the buffer */
-        if (debugtrace_prd == debugtrace_bytes-1)
-            debugtrace_prd = 0;
+        serial_puts(sercon_handle, buf);
+    }
+    else
+    {
+        for ( p = buf; *p != '\0'; p++ )
+        {
+            debugtrace_buf[debugtrace_prd++] = *p;
+            
+            /* always leave a null byte at the end of the buffer */
+            if (debugtrace_prd == debugtrace_bytes-1)
+                debugtrace_prd = 0;
+        }
     }
 
     spin_unlock_irqrestore(&debugtrace_lock, flags);
@@ -568,7 +586,7 @@ static int __init debugtrace_init(void)
     debugtrace_buf = (unsigned char *)alloc_xenheap_pages(order);
     ASSERT(debugtrace_buf != NULL);
 
-    memset(debugtrace_buf, '\0', debugtrace_bytes);
+    debugtrace_reset(0);
 
     return 0;
 }
@@ -593,6 +611,8 @@ void panic(const char *fmt, ...)
     unsigned long flags;
     extern void machine_restart(char *);
     
+    debugtrace_dump(0);
+
     va_start(args, fmt);
     (void)vsnprintf(buf, sizeof(buf), fmt, args);
     va_end(args);
@@ -611,8 +631,6 @@ void panic(const char *fmt, ...)
     __putstr("Reboot in five seconds...\n");
     spin_unlock_irqrestore(&console_lock, flags);
 
-    debugtrace_dump();
-
     mdelay(5000);
     machine_restart(0);
 }
index 4b274e197516b3492a6603240d53d3dfaf93c49a..eda62214afa476521211cd9544a4e35eece78fbd 100644 (file)
@@ -7,8 +7,8 @@
 #include <xen/string.h>
 
 #define BUG() do {                                     \
+    debugtrace_dump(0);                                 \
     printk("BUG at %s:%d\n", __FILE__, __LINE__);      \
-    debugtrace_dump();                                  \
     FORCE_CRASH();                                      \
 } while ( 0 )
 
@@ -28,13 +28,13 @@ struct domain;
 void cmdline_parse(char *cmdline);
 
 #ifndef NDEBUG
-extern void debugtrace_reset(void);
-extern void debugtrace_dump(void);
+extern void debugtrace_reset(int send_to_console);
+extern void debugtrace_dump(int send_to_console);
 extern void debugtrace_printk(const char *fmt, ...);
 #else
-#define debugtrace_reset()         ((void)0)
-#define debugtrace_dump()          ((void)0)
-#define debugtrace_printk(_f, ...) ((void)0)
+#define debugtrace_reset(_send_to_console) ((void)0)
+#define debugtrace_dump(_send_to_console)  ((void)0)
+#define debugtrace_printk(_f, ...)         ((void)0)
 #endif
 
 #define printk printf